package cn.tedu.charging.user.service.impl;

import cn.tedu.charging.common.utils.JsonUtils;
import cn.tedu.charging.user.dao.repository.UserRepository;
import cn.tedu.charging.user.pojo.po.UserPO;
import cn.tedu.charging.user.pojo.vo.WxLoginData;
import cn.tedu.charging.user.service.WXLoginService;
import com.alibaba.nacos.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Slf4j
@Service
public class WXLoginServiceImpl implements WXLoginService {

    /**
     * appId 替换成你的appId ,应该放到配置文件里      一般不会写死，所以放配置文件里
     */
    String appId = "wx3457cfae99472c30";

    /**
     * 小程序密钥 替换成你的AppSecret  应该放到配置文件里
     */
    String appSecret = "340c928c60ca459174c87c4a5e173429";

    @Autowired
    private UserRepository userRepository;

    /**
     * openid 和我们  用户id 映射
     * @param code
     * @param nickName
     * @return
     */
    @Override
    public Integer login(String code, String nickName) {

        //调用微信服务 获取用户的openId
        String openId = getOpenId(code);
        //通过openId获取用户信息    数据库charging_user_info里是根据微信openId判断的
        UserPO userPO = userRepository.getUserByOpenId(openId);
        //判断用户是否为空
        if (userPO != null) {
            //不为空 返回用户id
            return userPO.getId();
        }else {
            //为空 保存用户
            return userRepository.saveUser(openId,nickName);
        }

        //取出openid 后去数据库查询
        // 如果数据库不存在 第一次登录，保存 生成用户id 可以用数据库自增，也可以通过别的方式生成雪花也可以 一定要唯一
        //返回生成的用户id
        //存在 不是第一次登录 查询 直接返回userId，每次登录时的userId是相同的，就是微信开发工具手机端，登录后，右面storage存储里的userId每次一样
    }

    /**
     * 通过code 调用微信服务获取 唯一的 openId
     * @param code
     * @return
     */
    private String getOpenId(String code) {
        //通过微信的接口地址和appidAppID(小程序ID)和 appSecret AppSecret(小程序密钥)
        String url = "https://api.weixin.qq.com/sns/jscode2session?" +
                "appid=" + appId +
                "&secret=" + appSecret +
                "&js_code=" + code +
                "&grant_type=authorization_code";
        //利用spring原生http请求工具对接口进行请求
        RestTemplate restTemplate = new RestTemplate();
        String jsonData = restTemplate.getForObject(url, String.class);
        log.debug("调用微信地址获取用户信息:{}",jsonData);
        /*得到的jsonData是{"errcode":40029,"errmsg":"invalid code, rid: 66ab1988-4a8a41d1-4c5fc1a9"}
          前端network出现login报错500
          通义灵码解释
          请求中提供的code无效。在微信登录流程中，code是在用户授权后由微信临时生成并返回给应用的一个短串，用于换取access_token和openid等信息。
          code的有效期很短，一般在5分钟内有效。
          原因分析：
            过期的code：code可能已经过期。
            错误的code：code可能在传输过程中被篡改或错误记录。
            重复使用code：每个code只能使用一次，重复使用会导致失败。
            不匹配的appid/appsecret：请求中使用的appid或appsecret与code关联的账户不匹配。*/

        WxLoginData wxLoginData = JsonUtils.fromJson(jsonData, WxLoginData.class);
        //debug下执行，看到返回结果，于是新建WxLoginData接收，将json格式转为java的对象
        //{"session_key":"eyYhTlvXQ6L+uTgwRuk6hA==",
        // "openid":"o8qfb6Kor2EIEg-7h4nkquviUMQA"}
        //openid 就是微信来确定唯一用户的

        //String openid = jsonData.getString("openid");//这个会报错，类型转换错误
        if (jsonData != null && StringUtils.isNotBlank(wxLoginData.getOpenid())) {
            return wxLoginData.getOpenid();
        }
        return "";

        //mybatis怎么生成userId？？？有自带方法？？？
    }
}
